package servicesImpl;

import java.io.File;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import services.XMLService;
import dominio.Item;
import dominio.ListaPrecios;
import dominio.Proveedor;
import dominio.Rodamiento;

public class XMLServiceImpl extends UnicastRemoteObject implements XMLService{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	static Document doc;
	private String origen, marca, paisori, codprop, tipo, codskf, nombreLista;
	private Float precio;
	private Integer id_item, stock, idProveedor;
	private Date fecha;
	private Float desc, precioFinal;
	public XMLServiceImpl() throws RemoteException{}

	public List<ListaPrecios> leerXML() throws RemoteException{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;

		// ListaPrecios lp =null;
		List<ListaPrecios> lp = new ArrayList<ListaPrecios>();
		List<Item> items = new ArrayList<Item>();
		File folder = new File("listas_precios");
		File[] listOfFiles = folder.listFiles();// obtiene los nombres de los
												// archivos de la lista_precios

		try {
			for (int i = 0; i < listOfFiles.length; i++) {
				if (listOfFiles[i].isFile()) {
					File file = new File("listas_precios/"
							+ listOfFiles[i].getName());
					items = new ArrayList<Item>();
					builder = factory.newDocumentBuilder();
					doc = builder.parse(file);
					NodeList nodoNomList = doc.getElementsByTagName("NombreLista");
					nombreLista = (nodoNomList.item(0).getChildNodes().item(0)
							.getNodeValue());
					NodeList nodoPr = doc.getElementsByTagName("IdProveedor");
					idProveedor = Integer.parseInt(nodoPr.item(0).getChildNodes().item(0)
							.getNodeValue());
					NodeList nodofecha = doc.getElementsByTagName("Fecha");
					DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
					fecha = df.parse(nodofecha.item(0).getChildNodes().item(0)
							.getNodeValue());
					NodeList nodosItem = doc.getElementsByTagName("Item");

					for (int j = 0; j < nodosItem.getLength(); j++) {
						id_item = Integer.parseInt(nodosItem.item(j)
								.getAttributes().item(0).getNodeValue());
						origen = nodosItem.item(j).getChildNodes().item(1)
								.getChildNodes().item(0).getNodeValue();
						marca = nodosItem.item(j).getChildNodes().item(3)
								.getChildNodes().item(0).getNodeValue();
						paisori = nodosItem.item(j).getChildNodes().item(5)
								.getChildNodes().item(0).getNodeValue();
						codprop = nodosItem.item(j).getChildNodes().item(7)
								.getChildNodes().item(0).getNodeValue();
						codskf = nodosItem.item(j).getChildNodes().item(9)
								.getChildNodes().item(0).getNodeValue();
						tipo = nodosItem.item(j).getChildNodes().item(11)
								.getChildNodes().item(0).getNodeValue();
						precio = Float.valueOf(nodosItem.item(j)
								.getChildNodes().item(13).getChildNodes()
								.item(0).getNodeValue());
						stock = Integer.parseInt(nodosItem.item(j)
								.getChildNodes().item(15).getChildNodes()
								.item(0).getNodeValue());
						items.add(new Item(id_item, new Rodamiento(origen,
								marca, paisori, codprop, codskf, tipo, stock),
								precio, stock,nombreLista,false));
					}
					Proveedor prov = ProveedorServiceImpl.getInstancia().findByID(idProveedor);
					lp.add(new ListaPrecios(items, fecha, prov));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lp;// devuelvo las listas de precio

	}

	public List<ListaPrecios> leerXmlLOF() throws RemoteException{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;

		// ListaPrecios lp =null;
		List<ListaPrecios> lp = new ArrayList<ListaPrecios>();
		List<Item> items = new ArrayList<Item>();

		File folder = new File("listas_ofertas");
		File[] listOfFiles = folder.listFiles();// obtiene los nombres de los
												// archivos de la lista_precios

		try {
			for (int i = 0; i < listOfFiles.length; i++) {
				if (listOfFiles[i].isFile()) {
					File file = new File("listas_ofertas/"
							+ listOfFiles[i].getName());
					items = new ArrayList<Item>();
					builder = factory.newDocumentBuilder();
					doc = builder.parse(file);
					NodeList nodoNomList = doc.getElementsByTagName("NombreLista");
					nombreLista = (nodoNomList.item(0).getChildNodes().item(0)
							.getNodeValue());
					NodeList nodoPr = doc.getElementsByTagName("IdProveedor");
					idProveedor = Integer.parseInt(nodoPr.item(0).getChildNodes().item(0)
							.getNodeValue());
					NodeList nodofecha = doc.getElementsByTagName("Fecha");
					DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
					fecha = df.parse(nodofecha.item(0).getChildNodes().item(0)
							.getNodeValue());
					NodeList nodosItem = doc.getElementsByTagName("Item");

					for (int j = 0; j < nodosItem.getLength(); j++) {
						id_item = Integer.parseInt(nodosItem.item(j)
								.getAttributes().item(0).getNodeValue());
						origen = nodosItem.item(j).getChildNodes().item(1)
								.getChildNodes().item(0).getNodeValue();
						marca = nodosItem.item(j).getChildNodes().item(3)
								.getChildNodes().item(0).getNodeValue();
						paisori = nodosItem.item(j).getChildNodes().item(5)
								.getChildNodes().item(0).getNodeValue();
						codprop = nodosItem.item(j).getChildNodes().item(7)
								.getChildNodes().item(0).getNodeValue();
						codskf = nodosItem.item(j).getChildNodes().item(9)
								.getChildNodes().item(0).getNodeValue();
						tipo = nodosItem.item(j).getChildNodes().item(11)
								.getChildNodes().item(0).getNodeValue();
						precio = Float.valueOf(nodosItem.item(j)
								.getChildNodes().item(13).getChildNodes()
								.item(0).getNodeValue());
						stock = Integer.parseInt(nodosItem.item(j)
								.getChildNodes().item(15).getChildNodes()
								.item(0).getNodeValue());
						desc = Float.valueOf(nodosItem.item(j).getChildNodes()
								.item(17).getChildNodes().item(0)
								.getNodeValue());
						precioFinal = calcularDesc(desc, precio);
						//precioFinal = precio * (1-desc); //le aplico el descuento al precio
						items.add(new Item(id_item, new Rodamiento(origen,
								marca, paisori, codprop, codskf, tipo, stock),
								precioFinal, stock,nombreLista,true));
					}
					Proveedor prov = ProveedorServiceImpl.getInstancia().findByID(idProveedor);
					lp.add(new ListaPrecios(items, fecha, prov));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return lp;// devuelvo las listas de precio

	}

	private float calcularDesc(Float desc, Float precio) {

		float descuento = (precio * desc) / 100;

		return precio - descuento;
	}

}
